package cn.com.polymorphic;/**本类用于测试多态*/
/**Polymorphic:多态：1.继承 + 2.重写 */
public class TestPolymorphic {
    /*多态是面向对象程序设计（OOP）的一个重要特征，指同一个实体同时具有多种形式，
     即同一个对象，在不同时刻，代表的对象不一样，指的是对象的多种形态。
     */
    public static void main(String[] args) {
        //4.创建父类对象进行测试
        Animal a = new Animal();
        a.eat();//小动物Animal吃啥都行~~~
        //a.jump();/*父类无法使用子类的特有方法*/

        //5.创建子类对象进行测试
        Cat c = new Cat();
        c.eat();//小猫Cat爱吃小鱼干!!!--调用的是【重写以后的功能】
        c.jump();//小猫Cat跳的老高啦

        //6.创建【多态对象】进行测试
        /**口诀1:父类引用 指向 子类对象*/
        /**口诀2:编译(父类保存)看左边,运行(子类重写)看右边*/
        /*多态的两个前提：继承+重写*/ //多态使用的是父类的声明，子类的具体实现。
        Animal a2 = new Cat();//子类披着父类的外衣，干着父类的活，或者调用重写父类的功能，不可以调用子类特有的功能。
        Animal a3 = new Dog();
        a2.eat();//eat()使用的是父类的声明,但使用的依然是【子类重写过】的实现方式
        a3.eat();
        /**多态的出现是为了【统一调用标准,向父类看齐】
         * 父类提供的功能才能用,子类特有的功能父类用不了，
         * 如果想用，那就单独纯粹创建子类对象*/

    }
}
//1.创建父类
class Animal{
    //.创建父类中的普通方法eat()
    public void eat() {
        System.out.println("小动物Animal吃啥都行~~~");
    }
}

//2.创建子类Cat【继承】父类Animal
class Cat extends Animal{
    //重写:方法签名保持一致(返回值类型 方法名(参数列表) )
    // & 权限修饰符 >= 父类权限修饰符
    //2.1.【重写】父类中的普通方法--对父类中的代码功能修改
    public void eat() { /*重写 */
        System.out.println("小猫Cat爱吃小鱼干!!!");
    }
   //2.2.定义了子类特有的普通方法
    public void jump() {
        System.out.println("小猫Cat跳的老高啦");
    }
}
//3.创建子类Dog【继承】父类Animal
class Dog extends Animal{
    //3.1【重写】父类中的普通方法
    public void eat() { /*重写*/
        System.out.println("小狗爱吃肉骨头!!!");
    }
}

